package com.ahora.org.ejb.jpa.beans;

import java.io.Serializable;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import com.ahora.org.ejb.jpa.entities.Area;
import com.ahora.org.ejb.jpa.entities.Cita;
import com.ahora.org.ejb.jpa.entities.EstadoGenerales;
import com.ahora.org.ejb.jpa.entities.Persona;

public class CitaDTO implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private String descEstadoCita;

	public String getDescEstadoCita() {
		return descEstadoCita;
	}

	public void setDescEstadoCita(String descEstadoCita) {
		this.descEstadoCita = descEstadoCita;
	}

	private int idCita;
	private Integer idPersona;
	private int idEstado;
	private String asunto;
	private Date fecha = new Date();
	private int idHora = -1;
	private String hora;

	private Integer idUnidOrg;
	private List<SelectItem> listHorario;

	public String getAsunto() {
		return asunto;
	}

	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public int getIdHora() {
		return idHora;
	}

	public void setIdHora(int idHora) {
		this.idHora = idHora;
	}

	public Integer getIdUnidOrg() {
		return idUnidOrg;
	}

	public void setIdUnidOrg(Integer idUnidOrg) {
		this.idUnidOrg = idUnidOrg;
	}

	public int getIdCita() {
		return idCita;
	}

	public void setIdCita(int idCita) {
		this.idCita = idCita;
	}

	public Integer getIdPersona() {
		return idPersona;
	}

	public void setIdPersona(Integer idPersona) {
		this.idPersona = idPersona;
	}

	public int getIdEstado() {
		return idEstado;
	}

	public void setIdEstado(int idEstado) {
		this.idEstado = idEstado;
	}

	public String getHora() {
		return hora;
	}

	public void setHora(String hora) {
		this.hora = hora;
	}

	public String getHora(int i) {
		switch (i) {
		case 1:
			return "8:00 am - 8:30 am";
		case 2:
			return "8:30 am - 9:00 am";
		case 3:
			return "9:00 am - 9:30 am";
		case 4:
			return "9:30 am - 10:00 am";
		case 5:
			return "10:00 am - 10:30 am";
		case 6:
			return "10:30 am - 11:00 am";
		case 7:
			return "11:00 am - 11:30 am";
		case 8:
			return "11:30 am - 12:00 pm";
		case 9:
			return "12:00 pm - 12:30 pm";
		case 10:
			return "12:30 pm - 1:00 pm";
		case 11:
			return "1:00 pm - 1:30 pm";
		case 12:
			return "1:30 pm - 2:00 pm";
		case 13:
			return "2:00 pm - 2:30 pm";
		case 14:
			return "2:30 pm - 3:00 pm";
		case 15:
			return "3:00 pm - 3:30 pm";
		case 16:
			return "3:30 pm - 4:00 pm";
		case 17:
			return "4:00 pm - 4:30 pm";
		default:
			return "4:30 pm - 5:00 pm";
		}
	}

	public List<SelectItem> getListHorario() {
		listHorario = new ArrayList<SelectItem>();
		try {
			for (int i = 1; i < 19; i++) {
				listHorario.add(new SelectItem(i, getHora(i)));
			}
		} catch (Exception e) {
			e.getMessage();
		}

		return listHorario;
	}

	public void setListHorario(List<SelectItem> listHorario) {
		this.listHorario = listHorario;
	}

	public Cita getReturnTbCita(CitaDTO citaDTO) {
		Cita cita = null;
		Area area = null;
		Persona persona = null;
		EstadoGenerales estado = null;
		try {
			cita = new Cita();
			cita.setAsunto(asunto);
			cita.setFechaIni(getFecIniTimeStamp(fecha, getHora(idHora)));
			cita.setFechaFin(getFecFinTimeStamp(fecha, getHora(idHora)));
			if (idUnidOrg != null) {
				area = new Area();
				area.setIdArea(idUnidOrg);
			}
			cita.setTbArea(area);
			estado = new EstadoGenerales();
			estado.setIdEstadoDRE(idEstado);

			cita.setTbEstado_DRE(estado);
			// cita.setTbEstadoGenerales(estado);
			if (idPersona != null) {
				persona = new Persona();
				persona.setIdPersona(idPersona);
			}
			if(citaDTO.getObservacion()!=null){
				cita.setObservacion(citaDTO.getObservacion());
			}
			
			cita.setTbPersona(persona);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return cita;
	}

	public Timestamp getFecIniTimeStamp(Date fecha, String hora) {
		String fechaCadena = DateFormat.getDateInstance(DateFormat.SHORT).format(fecha);
		System.out.println("RONNYYYYYYYYYYYYYYYYYYYYYYYYY@"+fechaCadena+"@");
		String horaCadena = hora.substring(0, hora.indexOf(" - ")).trim();

		SimpleDateFormat loquequiero = new SimpleDateFormat("dd/MM/yyyy H:mm");
		Date f = null;
		Timestamp ts = null;
		try {
			f = loquequiero.parse(fechaCadena + " " + hora24H(horaCadena));
			ts = new Timestamp(f.getTime());
		} catch (Exception e) {
			e.printStackTrace();

		}
		return ts;
	}

	private Timestamp getFecFinTimeStamp(Date fecha, String hora) {
		String fechaCadena = DateFormat.getDateInstance(DateFormat.SHORT).format(fecha);
		String horaCadena = hora.substring(hora.lastIndexOf("- ") + 1,
				hora.length()).trim();

		SimpleDateFormat loquequiero = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		Date f = null;
		Timestamp ts = null;
		try {
			f = loquequiero.parse(fechaCadena + " " + hora24H(horaCadena));
			ts = new Timestamp(f.getTime());
		} catch (Exception e) {
			e.printStackTrace();

		}
		return ts;
	}

	private String hora24H(String hora) {
		int h = Integer.parseInt(hora.substring(0, hora.indexOf(":")));
		if (hora.indexOf("pm") != -1 && h != 12) {
			h = 12 + h;
			return h+ hora.substring(hora.indexOf(":"), hora.indexOf("p")).trim();
		} else if (h == 12) {
			return h+ hora.substring(hora.indexOf(":"), hora.indexOf("p")).trim();
		} else {
			return h+ hora.substring(hora.indexOf(":"), hora.indexOf("a")).trim();
		}
	}

	public Timestamp getFecIniTimeStamp() {
		return getFecIniTimeStamp(this.fecha, getHora(this.idHora));
	}

	public Timestamp getFecFinTimeStamp() {
		return getFecFinTimeStamp(this.fecha, getHora(this.idHora));
	}

	public void tbCitaToCtitaDO(Cita tbCita) {

		try {
			DateFormat dfFecha = new SimpleDateFormat("dd/MM/yy");
			DateFormat dfHora = new SimpleDateFormat("h:mm aa");
			// DateFormat dfHoraCita = new SimpleDateFormat("");
			for (SelectItem s : getListHorario()) {
				if (s.getLabel().startsWith(
						dfHora.format(tbCita.getFechaIni()).toLowerCase())) {
					setIdHora((Integer) s.getValue());
					break;
				}
			}
			setIdCita(tbCita.getIdCita());
			setAsunto(tbCita.getAsunto());
			setFecha((Date) dfFecha.parse(dfFecha.format(tbCita.getFechaIni())));
			setIdEstado(tbCita.getTbEstado_DRE().getIdEstadoDRE());
			setDescDependencia(tbCita.getTbArea().getDescripcion().trim());
			setDescEstadoCita(tbCita.getTbEstado_DRE().getDescripcion());
			if (tbCita.getTbEstado_DRE().getIdEstadoDRE()== 30) {
				setTipoEvento("AGENDA PUBLICA");
			} else {
				setTipoEvento("CITA");
			}
			setIdUnidOrg(tbCita.getTbArea().getIdArea());
			if(tbCita.getObservacion()!=null){
				setObservacion(tbCita.getObservacion());
			}
			
			if(tbCita.getTbPersona().getIdPersona()!=0){
				setDescLugar(tbCita.getObservacion());
			}
			setIdPersona(tbCita.getTbPersona().getIdPersona());
			String nomPer = tbCita.getTbPersona().getApellPater().trim() + " "
			+ tbCita.getTbPersona().getApellMater().trim() + ", "
			+ tbCita.getTbPersona().getNombrePersona().trim();
	setDescPersonaAdm(nomPer);
		}catch (NullPointerException e) {
			System.out.println("LLegue aca pero no se cae :D");
			setDescLugar("MUNICIPALIDAD");
		} 
		catch (Exception e) {
			e.printStackTrace();
		}

	}

	public Timestamp getFechRegistro() {
		return fechRegistro;
	}

	public void setFechRegistro(Timestamp fechRegistro) {
		this.fechRegistro = fechRegistro;
	}

	public Timestamp getFechModificacion() {
		return fechModificacion;
	}

	public void setFechModificacion(Timestamp fechModificacion) {
		this.fechModificacion = fechModificacion;
	}

	public Integer getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(Integer idUsuario) {
		this.idUsuario = idUsuario;
	}

	// Para retornar la fecha indicada en timesatamp
	public String getFechaInicio() {
		DateFormat dfFecha = new SimpleDateFormat("dd/MM/yy h:mm aa");
		return dfFecha.format(getFecIniTimeStamp()).toLowerCase();
	}

	public String getFechaFin() {
		DateFormat dfFecha = new SimpleDateFormat("dd/MM/yy h:mm aa");
		return dfFecha.format(getFecFinTimeStamp()).toLowerCase();
	}

	private String descDependencia;
	private String descPersonaAdm;

	public Integer getRadioButton() {
		return radioButton;
	}

	public void setRadioButton(Integer radioButton) {
		this.radioButton = radioButton;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	public String getDescPersonaAdm() {
		return descPersonaAdm;
	}

	public void setDescPersonaAdm(String descPersonaAdm) {
		this.descPersonaAdm = descPersonaAdm;
	}

	public String getDescDependencia() {
		return descDependencia;
	}

	public void setDescDependencia(String descDependencia) {
		this.descDependencia = descDependencia;
	}

	// Aca empiezo a trabajar el resultado de la cita
	private Integer radioButton;
	private String observacion;
	private Timestamp fechRegistro;
	private Timestamp fechModificacion;
	private Integer idUsuario;
	private boolean estRadioButon = false;

	public boolean isEstRadioButon() {
		return estRadioButon;
	}

	public void setEstRadioButon(boolean estRadioButon) {
		this.estRadioButon = estRadioButon;
	}

	private String fechaString;

	public String getFechaString() {
		return DateFormat.getDateInstance(DateFormat.SHORT).format(this.fecha);
	}

	public void setFechaString(String fechaString) {
		this.fechaString = fechaString;
	}

	public String getHoraString() {
		DateFormat dfHora = new SimpleDateFormat("h:mm aa");
		return dfHora.format(getFecIniTimeStamp()).toLowerCase() + " - "
				+ dfHora.format(getFecFinTimeStamp()).toLowerCase();
	}

	private String tipoEvento;

	public String getTipoEvento() {
		return tipoEvento;
	}

	public void setTipoEvento(String tipoEvento) {
		this.tipoEvento = tipoEvento;
	}

	private String descLugar;

	public String getDescLugar() {
		return descLugar;
	}

	public void setDescLugar(String descLugar) {
		this.descLugar = descLugar;
	}
}
